package aerolinea;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;

import ordenamiento.Ordenamiento;
import vuelo.Vuelo;
import vuelo.VueloDirecto;
import busqueda.Busqueda;
import filtro.Filtro;
import asiento.Asiento;

public class TodasLasAerolineas {
	private Collection<Aerolinea> aerolineas = new ArrayList<Aerolinea>();
	private Collection<Filtro> filtros;
	private Ordenamiento ordenamientos;
	private Hashtable<String, Vuelo> vuelosPorCodigoDeVuelo;
	private static TodasLasAerolineas instance = null;
	
	public static TodasLasAerolineas getInstance() {
		if(instance == null){
			instance = new TodasLasAerolineas();
			instance.getAerolineas().add(new LanchitaAdapter());
			instance.getAerolineas().add(new OceanicAdapter());
			instance.setVuelosPorCodigoDeVuelo(new Hashtable<String, Vuelo>());
		}
		return instance;
	}
	
	public Collection<Vuelo> buscarVuelos(Busqueda busqueda){
		
		Collection<Vuelo> colVuelos = new ArrayList<Vuelo>();
		
		for (Aerolinea aerolinea: this.aerolineas){
			
			colVuelos.addAll(busqueda.filtrar(busqueda.buscarVuelos(aerolinea)));		
		}
		
		return colVuelos;
	}

	public void setFiltros(Filtro filtro) {
		this.filtros.add(filtro);
	}
	public Collection<Filtro> getFiltros() {
		return filtros;
	}
	public void setOrdenamientos(Ordenamiento ordenamientos) {
		this.ordenamientos = ordenamientos;
	}
	public Ordenamiento getOrdenamientos() {
		return ordenamientos;
	}
	public Collection<Aerolinea> getAerolineas() {
		return aerolineas;
	}
	public void setAerolineas(Collection<Aerolinea> aerolineas) {
		this.aerolineas = aerolineas;
	}
	public void setFiltros(Collection<Filtro> filtros) {
		this.filtros = filtros;
	}
	public Hashtable<String, Vuelo> getVuelosPorCodigoDeVuelo() {
		return vuelosPorCodigoDeVuelo;
	}

	public void setVuelosPorCodigoDeVuelo(
			Hashtable<String, Vuelo> vuelosPorCodigoDeVuelo) {
		this.vuelosPorCodigoDeVuelo = vuelosPorCodigoDeVuelo;
	}
	
	public BigDecimal obtenerPopularidad(VueloDirecto vueloDirecto) {
		return this.getVuelosPorCodigoDeVuelo().get(vueloDirecto.getCodigoDeVuelo())!=null ?new BigDecimal(getVuelosPorCodigoDeVuelo().get(vueloDirecto.getCodigoDeVuelo()).getAsientos().size()) : new BigDecimal(0);
	}
	
	public void agregarCompraEnTabla(Asiento asiento){
		vuelosPorCodigoDeVuelo.put(asiento.getCodigoAsiento(), asiento.getVuelo());
	}

	
}
